package com.devshephard.jucks.CASDemo;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * CAS compareAndSwap 比较并交换 CPU底层原语
 * 比较当前工作内存中的值和主存中的值,如果是期望的值,则执行操作,否则一直循环!
 * 缺点:
 *     1.循环耗时(自旋锁)
 *     2.一次性只能保证一个共享变量的原子性.
 *     3.ABA问题
 */
public class CASDemo {

    public static void main(String[] args) {

        AtomicInteger atomicInteger = new AtomicInteger(1);

        //CAS比较并交换
        System.out.println(atomicInteger.compareAndSet(1, 2)); //如果前值已经更新为后值,则不更新.
        System.out.println(atomicInteger.get());

        System.out.println(atomicInteger.compareAndSet(2, 4)); //由于前面已经更新过了,则更新失败.
        System.out.println(atomicInteger.get());


        atomicInteger.getAndIncrement(); //Atomic底层加一操作
        //其底层代码如下,使用C++操作内存偏移量,达到+1的效果.其本身是一个自旋锁.
        //var1相当于数组对象a,var2相当于a中的角标(内存偏移量),因为var5 == a[i],var5+1就是a[i]+1,即实现了+1操作
        /**public final int getAndAddInt(Object var1, long var2, int var4) {
            int var5;
            do {
                var5 = this.getIntVolatile(var1, var2);
            } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));

            return var5;
        }**/


    }

}
